<!DOCTYPE html>
<!-- saved from url=(0016)http://localhost -->
<html>
  <head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <title>企业安全管理和实现</title>
    <style>
        body{
            margin: 0;
        }
        #content-info{
            width: auto;
            margin: 0 auto;
            text-align: center;
        }
        #author-info{
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
        }
        #title{
            text-overflow: ellipsis;
            white-space: nowrap;
            overflow: hidden;
            padding-top: 10px;
            margin-bottom: 2px;
            font-size: 34px;
            color: #505050;
        }
        .text{
            white-space:nowrap;
            text-overflow: ellipsis;
            display: inline-block;
            margin-right: 20px;
            margin-bottom: 2px;
            font-size: 20px;
            color: #8c8c8c;
        }
        #navBar{
            width: auto;
            height: auto;
            position: fixed;
            right:0;
            bottom: 0;
            background-color: #f0f3f4;
            overflow-y: auto;
            text-align: center;
        }
        #svg-container{
            width: 100%;
            overflow-x: scroll;
            min-width: 0px;
            margin: 0 10px;
        }
        #nav-thumbs{
            overflow-y: scroll;
            padding: 0 5px;
        }
        .nav-thumb{
            position: relative;
            margin: 10px auto;
        }
        .nav-thumb >p{
            text-align: center;
            font-size: 12px;
            margin: 4px 0 0 0;
        }
        .nav-thumb >div{
            position: relative;
            display: inline-block;
            border: 1px solid #c6cfd5;
        }
        .nav-thumb img{
            display: block;
        }
        #main-content{
            bottom: 0;
            left: 0;
            right: 0;
            background-color: #d0cfd8;
            display: flex;
            height: auto;
            flex-flow: row wrap;
            text-align:center;
        }
        #svg-container >svg{
            display: block;
            margin:10px auto;
            margin-bottom: 0;
        }
        #copyright{
            bottom: 0;
            left: 50%;
            margin: 5px auto;
            font-size: 16px;
            color: #515151;
        }
        #copyright >a{
            text-decoration: none;
            color: #77C;
        }
        .number{
            position: absolute;
            top:0;
            left:0;
            border-top:22px solid #08a1ef;
            border-right: 22px solid transparent;
        }
        .pagenum{
            font-size: 12px;
            color: #fff;
            position: absolute;
            top: -23px;
            left: 2px;
        }
            #navBar::-webkit-scrollbar{
            width: 8px;
            background-color: #f5f5f5;
        }
            #navBar::-webkit-scrollbar-track{
            -webkit-box-shadow: inset 0 0 4px rgba(0,0,0,.3);
            border-radius: 8px;
            background-color: #fff;
        }
            #navBar::-webkit-scrollbar-thumb{
            border-radius: 8px;
            -webkit-box-shadow: inset 0 0 4px rgba(0,0,0,.3);
            background-color: #6b6b70;
        }
        #navBar::-webkit-scrollbar-thumb:hover{
            background-color: #4a4a4f;
        }
</style>
  </head>
  <body>
    <div id="main-area">
      <div id="content-info">
        <div id="content-info">
          <div id="title">企业安全管理和实现</div>
        </div>
        <div id="author-info">
          <div id="author-name" class="text">yuguanc</div>
          <div id="share-time" class="text">2018-05-28</div>
        </div>
      </div>
      <div id="main-content">
        <div id="svg-container"><svg width="1672" viewBox="0 0 1672 2046" id="page1" xmlns:ed="http://www.edrawsoft.cn/xml/2017/SVGExtensions/" xmlns:xlink="http://www.w3.org/1999/xlink" height="2046" preserveAspectRadio="xMinYMin meet" ed:name="Page-1" ed:hSpacing="30" ed:vSpacing="30" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns="http://www.w3.org/2000/svg">
    <style type="text/css"><![CDATA[
g[ed\:togtopicid],g[ed\:hyperlink],g[ed\:comment],g[ed\:note] {cursor:pointer;}
g[id] {-moz-user-select: none;-ms-user-select: none;user-select: none;}
svg text::selection,svg tspan::selection{background-color: #4285f4;color: #ffffff;fill: #ffffff;}
.st8 {fill:#303030;font-family:宋体;font-size:10pt}
.st7 {fill:#303030;font-family:宋体;font-size:12pt}
.st9 {fill:#303030;font-family:宋体;font-size:14pt}
]]></style>
    <defs>
        <linearGradient id="lg3" y1="0%" y2="100%" x2="0%" x1="0%">
            <stop stop-color="#ffffff" offset="0"/>
            <stop stop-color="#f0f5f0" offset="0.25"/>
            <stop stop-color="#e1ebe1" offset="0.75"/>
            <stop stop-color="#c8d7c8" offset="1"/>
        </linearGradient>
    </defs>
    <rect fill="#ffffff" x="0" width="1672" y="0" height="2046"/>
    <path stroke="#4486b1" fill="none" id="244" ed:parentid="146,148,150" d="M0.1,0C6,0,5.9,5,5.9,5L5.9,35.2C5.9,35.2,6.9,39.5,12,39.5C6.9,39.6,5.9,43.7,5.9,43.7L5.9,73.9C5.9,73.9,5.8,78.9,0,78.9" transform="translate(1192,1377.4)" ed:idlist="146,150,148" ed:type="summary" stroke-linejoin="round"/>
    <g id="102" ed:parentid="101" transform="translate(616,1002.65)" ed:width="107" ed:height="40" ed:layout="rightmap">
        <path fill="#f5f9fe" stroke="#4486b1" d="M4,0L103,0C105.2,0,107,1.8,107,4L107,36C107,38.2,105.2,40,103,40L4,40C1.8,40,0,38.2,0,36L0,4C0,1.8,1.8,0,4,0z" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" id="103" stroke-linecap="round" d="M68.5,0C89.8,0,110.7,0,131.5,0" transform="translate(-131.5,20)" stroke-linejoin="round"/>
        <text class="st7">
            <tspan textLength="64" style="white-space:pre" x="22" lengthAdjust="spacing" y="26.5">生产网络</tspan>
        </text>
    </g>
    <g id="106" ed:parentid="102" transform="translate(752,413.8)" ed:width="86" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="107" stroke-linecap="round" d="M-14.5,294.2C5.8,294.2,-14.5,-294.2,14.5,-294.2" transform="translate(-14.5,314.68)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L86,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="78" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">基础架构安全</tspan>
        </text>
    </g>
    <g id="108" ed:parentid="102" transform="translate(752,954)" ed:width="60" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="109" stroke-linecap="round" d="M-14.5,24.1C2.4,24.1,-6.5,-24.1,14.5,-24.1" transform="translate(-14.5,44.58)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L60,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="52" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">应用安全</tspan>
        </text>
    </g>
    <g id="110" ed:parentid="102" transform="translate(752,1421.2)" ed:width="60" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="111" stroke-linecap="round" d="M-14.5,-209.5C5.8,-209.5,-14.5,209.5,14.5,209.5" transform="translate(-14.5,-189.02)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L60,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="52" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">业务安全</tspan>
        </text>
    </g>
    <g id="112" ed:parentid="102" transform="translate(752,1757)" ed:width="60" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="113" stroke-linecap="round" d="M-14.5,-377.4C5.8,-377.4,-14.5,377.4,14.5,377.4" transform="translate(-14.5,-356.93)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L60,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="52" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">安全运营</tspan>
        </text>
    </g>
    <g id="114" ed:parentid="106" transform="translate(867,151)" ed:width="86" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="115" stroke-linecap="round" d="M-14.5,131.4C5.8,131.4,-14.5,-131.4,14.5,-131.4" transform="translate(-14.5,151.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L86,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="78" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">物理安全保障</tspan>
        </text>
    </g>
    <g id="132" ed:parentid="108" transform="translate(841,720.4)" ed:width="276" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="133" stroke-linecap="round" d="M-14.5,116.8C5.8,116.8,-14.5,-116.8,14.5,-116.8" transform="translate(-14.5,137.3)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L276,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="268" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">公司WEB应用业务系统顶起漏洞扫描与渗透测试</tspan>
        </text>
    </g>
    <g id="134" ed:parentid="108" transform="translate(841,866.4)" ed:width="303" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="135" stroke-linecap="round" d="M-14.5,43.8C5.2,43.8,-13,-43.8,14.5,-43.8" transform="translate(-14.5,64.3)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L303,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="295" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">各产品线核心业务系统强制实施SDL(安全开发流程)</tspan>
        </text>
    </g>
    <g id="136" ed:parentid="108" transform="translate(841,1027)" ed:width="367" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="137" stroke-linecap="round" d="M-14.5,-36.5C4.4,-36.5,-11.2,36.5,14.5,36.5" transform="translate(-14.5,-16)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L367,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="359" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">WEB入侵检测、安全分析、安全非那根胡、态势感知机应急响应</tspan>
        </text>
    </g>
    <g id="138" ed:parentid="108" transform="translate(841,1143.8)" ed:width="276" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="139" stroke-linecap="round" d="M-14.5,-94.9C5.8,-94.9,-14.5,94.9,14.5,94.9" transform="translate(-14.5,-74.4)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L276,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="268" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">APP安全设计、安全测试、安全加固和安全检测</tspan>
        </text>
    </g>
    <g id="140" ed:parentid="110" transform="translate(841,1246)" ed:width="229" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="141" stroke-linecap="round" d="M-14.5,87.6C5.8,87.6,-14.5,-87.6,14.5,-87.6" transform="translate(-14.5,108.1)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L229,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="221" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">建立账号安全体系、账号安全监控系统</tspan>
        </text>
    </g>
    <g id="142" ed:parentid="110" transform="translate(841,1304.4)" ed:width="216" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="143" stroke-linecap="round" d="M-14.5,58.4C5.8,58.4,-14.5,-58.4,14.5,-58.4" transform="translate(-14.5,78.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L216,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="208" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">业务接口漏洞挖掘、安全监测与防护</tspan>
        </text>
    </g>
    <g id="144" ed:parentid="110" transform="translate(841,1348.2)" ed:width="307" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="145" stroke-linecap="round" d="M-14.5,36.5C4.4,36.5,-11.2,-36.5,14.5,-36.5" transform="translate(-14.5,57)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L307,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="299" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">建立反欺诈、作弊模型和策略、识别和阻塞作弊行为</tspan>
        </text>
    </g>
    <g id="146" ed:parentid="110" transform="translate(841,1377.4)" ed:width="346" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="147" stroke-linecap="round" d="M-14.5,21.9C2,21.9,-5.5,-21.9,14.5,-21.9" transform="translate(-14.5,42.4)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L346,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="338" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">建立数据分集策略，不同等级数据采取相应的安全防护策略</tspan>
        </text>
    </g>
    <g id="148" ed:parentid="110" transform="translate(841,1406.6)" ed:width="242" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="149" stroke-linecap="round" d="M-14.5,7.3C-1.2,7.3,1.8,-7.3,14.5,-7.3" transform="translate(-14.5,27.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L242,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="234" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">敏感数据加密传输、存储、展示脱敏处理</tspan>
        </text>
    </g>
    <g id="150" ed:parentid="110" transform="translate(841,1435.8)" ed:width="346" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="151" stroke-linecap="round" d="M-14.5,-7.3C-1.2,-7.3,1.8,7.3,14.5,7.3" transform="translate(-14.5,13.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L346,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="338" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">建立敏感数据访问审批流程呢个，实施严格的访问控制策略</tspan>
        </text>
    </g>
    <g id="152" ed:parentid="110" transform="translate(841,1494.2)" ed:width="333" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="153" stroke-linecap="round" d="M-14.5,-36.5C4.4,-36.5,-11.2,36.5,14.5,36.5" transform="translate(-14.5,-16)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L333,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="325" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">数据库漏洞扫描、安全加固、访问控制、安全监控及审计</tspan>
        </text>
    </g>
    <g id="154" ed:parentid="110" transform="translate(841,1581.8)" ed:width="125" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="155" stroke-linecap="round" d="M-14.5,-80.3C5.8,-80.3,-14.5,80.3,14.5,80.3" transform="translate(-14.5,-59.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L125,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="117" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">信息泄露调查、取证</tspan>
        </text>
    </g>
    <g id="156" ed:parentid="112" transform="translate(841,1654.8)" ed:width="283" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="157" stroke-linecap="round" d="M-14.5,51.1C5.6,51.1,-14.1,-51.1,14.5,-51.1" transform="translate(-14.5,71.6)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L283,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="275" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">建立SRC,从外部及时收集安全漏洞、威胁情报等</tspan>
        </text>
    </g>
    <g id="158" ed:parentid="112" transform="translate(841,1771.6)" ed:width="190" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="159" stroke-linecap="round" d="M-14.5,-7.3C-1.2,-7.3,1.8,7.3,14.5,7.3" transform="translate(-14.5,13.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L190,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="182" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">提升安全团队对内、对外影响力</tspan>
        </text>
    </g>
    <g id="160" ed:parentid="112" transform="translate(841,1873.8)" ed:width="99" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="161" stroke-linecap="round" d="M-14.5,-58.4C5.8,-58.4,-14.5,58.4,14.5,58.4" transform="translate(-14.5,-37.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L99,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="91" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">第三方安全合作</tspan>
        </text>
    </g>
    <g id="198" ed:parentid="132" transform="translate(1146,705.8)" ed:width="250" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="199" stroke-linecap="round" d="M-14.5,7.3C-1.2,7.3,1.8,-7.3,14.5,-7.3" transform="translate(-14.5,27.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L250,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="242" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">WEB漏洞扫描，集成至自动化安全扫描平台</tspan>
        </text>
    </g>
    <g id="200" ed:parentid="132" transform="translate(1146,735)" ed:width="346" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="201" stroke-linecap="round" d="M-14.5,-7.3C-1.2,-7.3,1.8,7.3,14.5,7.3" transform="translate(-14.5,13.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L346,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="338" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">每季度顶起实现内部和外部的渗透测试，输出渗透测试报告</tspan>
        </text>
    </g>
    <g id="202" ed:parentid="134" transform="translate(1173,764.2)" ed:width="150" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="203" stroke-linecap="round" d="M-14.5,51.1C5.6,51.1,-14.1,-51.1,14.5,-51.1" transform="translate(-14.5,71.6)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L150,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="142" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">VIPKID SDL 推动与实施</tspan>
        </text>
    </g>
    <g id="204" ed:parentid="134" transform="translate(1173,793.4)" ed:width="112" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="205" stroke-linecap="round" d="M-14.5,36.5C4.4,36.5,-11.2,-36.5,14.5,-36.5" transform="translate(-14.5,57)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L112,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="104" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">安全漏洞管理规范</tspan>
        </text>
    </g>
    <g id="206" ed:parentid="134" transform="translate(1173,822.6)" ed:width="107" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="207" stroke-linecap="round" d="M-14.5,21.9C2,21.9,-5.5,-21.9,14.5,-21.9" transform="translate(-14.5,42.4)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L107,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="99" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">WEB安全编码规范</tspan>
        </text>
    </g>
    <g id="208" ed:parentid="134" transform="translate(1173,851.8)" ed:width="107" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="209" stroke-linecap="round" d="M-14.5,7.3C-1.2,7.3,1.8,-7.3,14.5,-7.3" transform="translate(-14.5,27.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L107,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="99" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">WEB安全设计规范</tspan>
        </text>
    </g>
    <g id="210" ed:parentid="134" transform="translate(1173,881)" ed:width="151" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="211" stroke-linecap="round" d="M-14.5,-7.3C-1.2,-7.3,1.8,7.3,14.5,7.3" transform="translate(-14.5,13.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L151,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="143" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">项目上线前例行安全测试</tspan>
        </text>
    </g>
    <g id="212" ed:parentid="134" transform="translate(1173,910.2)" ed:width="112" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="213" stroke-linecap="round" d="M-14.5,-21.9C2,-21.9,-5.5,21.9,14.5,21.9" transform="translate(-14.5,-1.4)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L112,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="104" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">安全漏洞扫描平台</tspan>
        </text>
    </g>
    <g id="214" ed:parentid="134" transform="translate(1173,939.4)" ed:width="112" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="215" stroke-linecap="round" d="M-14.5,-36.5C4.4,-36.5,-11.2,36.5,14.5,36.5" transform="translate(-14.5,-16)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L112,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="104" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">项目安全评审系统</tspan>
        </text>
    </g>
    <g id="216" ed:parentid="134" transform="translate(1173,968.6)" ed:width="151" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="217" stroke-linecap="round" d="M-14.5,-51.1C5.6,-51.1,-14.1,51.1,14.5,51.1" transform="translate(-14.5,-30.6)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L151,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="143" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">自动化代码安全审计系统</tspan>
        </text>
    </g>
    <g id="218" ed:parentid="136" transform="translate(1237,997.8)" ed:width="29" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="219" stroke-linecap="round" d="M-14.5,14.6C0.5,14.6,-2,-14.6,14.5,-14.6" transform="translate(-14.5,35.1)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L29,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="21" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">WAF</tspan>
        </text>
    </g>
    <g id="220" ed:parentid="136" transform="translate(1237,1027)" ed:width="159" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="221" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L159,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="151" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">WEB日志实时安全分析平台</tspan>
        </text>
    </g>
    <g id="222" ed:parentid="136" transform="translate(1237,1056.2)" ed:width="159" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="223" stroke-linecap="round" d="M-14.5,-14.6C0.5,-14.6,-2,14.6,14.5,14.6" transform="translate(-14.5,5.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L159,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="151" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">WEB日志实时离线分析平台</tspan>
        </text>
    </g>
    <g id="224" ed:parentid="138" transform="translate(1146,1085.4)" ed:width="107" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="225" stroke-linecap="round" d="M-14.5,29.2C3.3,29.2,-8.6,-29.2,14.5,-29.2" transform="translate(-14.5,49.7)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L107,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="99" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">APP安全设计规范</tspan>
        </text>
    </g>
    <g id="226" ed:parentid="138" transform="translate(1146,1114.6)" ed:width="146" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="227" stroke-linecap="round" d="M-14.5,14.6C0.5,14.6,-2,-14.6,14.5,-14.6" transform="translate(-14.5,35.1)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L146,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="138" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">APP发版前例行安全测试</tspan>
        </text>
    </g>
    <g id="228" ed:parentid="138" transform="translate(1146,1143.8)" ed:width="146" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="229" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L146,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="138" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">APP自动化漏洞扫描系统</tspan>
        </text>
    </g>
    <g id="230" ed:parentid="138" transform="translate(1146,1173)" ed:width="146" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="231" stroke-linecap="round" d="M-14.5,-14.6C0.5,-14.6,-2,14.6,14.5,14.6" transform="translate(-14.5,5.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L146,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="138" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">APP自动化安全加固系统</tspan>
        </text>
    </g>
    <g id="232" ed:parentid="138" transform="translate(1146,1202.2)" ed:width="198" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="233" stroke-linecap="round" d="M-14.5,-29.2C3.3,-29.2,-8.6,29.2,14.5,29.2" transform="translate(-14.5,-8.7)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L198,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="190" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">钓鱼、盗版类APP监测系统或服务</tspan>
        </text>
    </g>
    <g id="234" ed:parentid="140" transform="translate(1099,1231.4)" ed:width="151" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="235" stroke-linecap="round" d="M-14.5,7.3C-1.2,7.3,1.8,-7.3,14.5,-7.3" transform="translate(-14.5,27.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L151,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="143" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">设计、开发账号安全中心</tspan>
        </text>
    </g>
    <g id="236" ed:parentid="140" transform="translate(1099,1260.6)" ed:width="203" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="237" stroke-linecap="round" d="M-14.5,-7.3C-1.2,-7.3,1.8,7.3,14.5,7.3" transform="translate(-14.5,13.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L203,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="195" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">账号安全监控功能集成至风控平台</tspan>
        </text>
    </g>
    <g id="238" ed:parentid="142" transform="translate(1086,1289.8)" ed:width="112" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="239" stroke-linecap="round" d="M-14.5,7.3C-1.2,7.3,1.8,-7.3,14.5,-7.3" transform="translate(-14.5,27.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L112,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="104" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">业务接口安全测试</tspan>
        </text>
    </g>
    <g id="240" ed:parentid="142" transform="translate(1086,1319)" ed:width="229" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="241" stroke-linecap="round" d="M-14.5,-7.3C-1.2,-7.3,1.8,7.3,14.5,7.3" transform="translate(-14.5,13.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L229,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="221" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">业务接口安全监控功能集成至风控平台</tspan>
        </text>
    </g>
    <g id="242" ed:parentid="144" transform="translate(1177,1348.2)" ed:width="203" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="243" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L203,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="195" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">反欺诈、作弊功能集成至风控平台</tspan>
        </text>
    </g>
    <g id="245" ed:parentid="244" transform="translate(1211,1402.35)" ed:width="184.725" ed:height="29" ed:layout="rightmap">
        <path fill="#ffffff" stroke="#4486b1" d="M14.5,0L163.2,0C167.1,0,172.8,-0.5,177,1.7C181.6,4.1,184.7,8.9,184.7,14.5C184.7,22.5,178.2,29,170.2,29L21.5,29C17.6,29,11.9,29.5,7.8,27.3C3.2,24.9,0,20.1,0,14.5C0,6.5,6.5,0,14.5,0z" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="146" style="white-space:pre" x="20" lengthAdjust="spacing" y="19.5">VIPKID数据安全管理制度</tspan>
        </text>
    </g>
    <g id="246" ed:parentid="152" transform="translate(1203,1465)" ed:width="255" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="247" stroke-linecap="round" d="M-14.5,14.6C0.5,14.6,-2,-14.6,14.5,-14.6" transform="translate(-14.5,35.1)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L255,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="247" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">数据库漏洞预警、集成至安全情报收集平台</tspan>
        </text>
    </g>
    <g id="248" ed:parentid="152" transform="translate(1203,1494.2)" ed:width="125" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="249" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L125,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="117" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">数据库安全加固规范</tspan>
        </text>
    </g>
    <g id="250" ed:parentid="152" transform="translate(1203,1523.4)" ed:width="125" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="251" stroke-linecap="round" d="M-14.5,-14.6C0.5,-14.6,-2,14.6,14.5,14.6" transform="translate(-14.5,5.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L125,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="117" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">数据库安全审计系统</tspan>
        </text>
    </g>
    <g id="252" ed:parentid="154" transform="translate(995,1552.6)" ed:width="190" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="253" stroke-linecap="round" d="M-14.5,14.6C0.5,14.6,-2,-14.6,14.5,-14.6" transform="translate(-14.5,35.1)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L190,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="182" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">信息泄露事件安全应急响应预案</tspan>
        </text>
    </g>
    <g id="254" ed:parentid="154" transform="translate(995,1581.8)" ed:width="164" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="255" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L164,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="156" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">成立信息安全应急响应中心</tspan>
        </text>
    </g>
    <g id="256" ed:parentid="154" transform="translate(995,1611)" ed:width="138" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="257" stroke-linecap="round" d="M-14.5,-14.6C0.5,-14.6,-2,14.6,14.5,14.6" transform="translate(-14.5,5.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L138,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="130" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">信息泄露安全分析系统</tspan>
        </text>
    </g>
    <g id="258" ed:parentid="156" transform="translate(1153,1640.2)" ed:width="138" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="259" stroke-linecap="round" d="M-14.5,7.3C-1.2,7.3,1.8,-7.3,14.5,-7.3" transform="translate(-14.5,27.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L138,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="130" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">建立安全应急响应团队</tspan>
        </text>
    </g>
    <g id="260" ed:parentid="156" transform="translate(1153,1669.4)" ed:width="159" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="261" stroke-linecap="round" d="M-14.5,-7.3C-1.2,-7.3,1.8,7.3,14.5,7.3" transform="translate(-14.5,13.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L159,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="151" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">开发、上线、运营SRC平台</tspan>
        </text>
    </g>
    <g id="264" ed:parentid="158" transform="translate(1060,1698.6)" ed:width="190" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="265" stroke-linecap="round" d="M-14.5,36.5C4.4,36.5,-11.2,-36.5,14.5,-36.5" transform="translate(-14.5,57)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L190,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="182" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">定期组织安全培训、安全沙龙等</tspan>
        </text>
    </g>
    <g id="266" ed:parentid="158" transform="translate(1060,1727.8)" ed:width="86" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="267" stroke-linecap="round" d="M-14.5,21.9C2,21.9,-5.5,-21.9,14.5,-21.9" transform="translate(-14.5,42.4)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L86,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="78" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">安全会议演讲</tspan>
        </text>
    </g>
    <g id="268" ed:parentid="158" transform="translate(1060,1757)" ed:width="86" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="269" stroke-linecap="round" d="M-14.5,7.3C-1.2,7.3,1.8,-7.3,14.5,-7.3" transform="translate(-14.5,27.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L86,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="78" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">安全会议赞助</tspan>
        </text>
    </g>
    <g id="270" ed:parentid="158" transform="translate(1060,1786.2)" ed:width="86" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="271" stroke-linecap="round" d="M-14.5,-7.3C-1.2,-7.3,1.8,7.3,14.5,7.3" transform="translate(-14.5,13.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L86,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="78" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">安全产品开源</tspan>
        </text>
    </g>
    <g id="272" ed:parentid="158" transform="translate(1060,1815.4)" ed:width="276" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="273" stroke-linecap="round" d="M-14.5,-21.9C2,-21.9,-5.5,21.9,14.5,21.9" transform="translate(-14.5,-1.4)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L276,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="268" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">带第三方安全漏洞平台、各大SRC提交安全漏洞</tspan>
        </text>
    </g>
    <g id="274" ed:parentid="158" transform="translate(1060,1844.6)" ed:width="125" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="275" stroke-linecap="round" d="M-14.5,-36.5C4.4,-36.5,-11.2,36.5,14.5,36.5" transform="translate(-14.5,-16)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L125,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="117" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">发表安全技术类文章</tspan>
        </text>
    </g>
    <g id="276" ed:parentid="160" transform="translate(969,1873.8)" ed:width="164" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="277" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L164,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="156" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">购买第三方安全产品、服务</tspan>
        </text>
    </g>
    <g id="278" ed:parentid="106" transform="translate(867,340.8)" ed:width="60" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="279" stroke-linecap="round" d="M-14.5,36.5C4.4,36.5,-11.2,-36.5,14.5,-36.5" transform="translate(-14.5,57)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L60,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="52" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">网络安全</tspan>
        </text>
    </g>
    <g id="280" ed:parentid="106" transform="translate(867,603.6)" ed:width="60" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="281" stroke-linecap="round" d="M-14.5,-94.9C5.8,-94.9,-14.5,94.9,14.5,94.9" transform="translate(-14.5,-74.4)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L60,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="52" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">系统安全</tspan>
        </text>
    </g>
    <g id="300" ed:parentid="278" transform="translate(956,180.2)" ed:width="99" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="326" stroke-linecap="round" d="M-14.5,80.3C5.8,80.3,-14.5,-80.3,14.5,-80.3" transform="translate(-14.5,100.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L99,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="91" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">安全域合理划分</tspan>
        </text>
    </g>
    <g id="301" ed:parentid="278" transform="translate(956,224)" ed:width="203" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="327" stroke-linecap="round" d="M-14.5,58.4C5.8,58.4,-14.5,-58.4,14.5,-58.4" transform="translate(-14.5,78.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L203,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="195" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">端口安全，仅对公网开放必要端口</tspan>
        </text>
    </g>
    <g id="302" ed:parentid="278" transform="translate(956,267.8)" ed:width="177" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="328" stroke-linecap="round" d="M-14.5,36.5C4.4,36.5,-11.2,-36.5,14.5,-36.5" transform="translate(-14.5,57)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L177,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="169" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">只允许线上业务系统对外开放</tspan>
        </text>
    </g>
    <g id="303" ed:parentid="278" transform="translate(956,297)" ed:width="281" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="329" stroke-linecap="round" d="M-14.5,21.9C2,21.9,-5.5,-21.9,14.5,-21.9" transform="translate(-14.5,42.4)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L281,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="273" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">传输安全：保障敏感数据在网络传输工程安全性</tspan>
        </text>
    </g>
    <g id="304" ed:parentid="278" transform="translate(956,370)" ed:width="190" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="330" stroke-linecap="round" d="M-14.5,-14.6C0.5,-14.6,-2,14.6,14.5,14.6" transform="translate(-14.5,5.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L190,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="182" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">网络攻击、入侵检测与安全防护</tspan>
        </text>
    </g>
    <g id="305" ed:parentid="278" transform="translate(956,472.2)" ed:width="177" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="331" stroke-linecap="round" d="M-14.5,-65.7C5.8,-65.7,-14.5,65.7,14.5,65.7" transform="translate(-14.5,-45.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L177,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="169" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">网络设备安全加固与安全审计</tspan>
        </text>
    </g>
    <g id="308" ed:parentid="300" transform="translate(1084,180.2)" ed:width="151" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="282" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L151,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="143" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">根据业务划分不同安全域</tspan>
        </text>
    </g>
    <g id="309" ed:parentid="301" transform="translate(1188,209.4)" ed:width="86" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="283" stroke-linecap="round" d="M-14.5,7.3C-1.2,7.3,1.8,-7.3,14.5,-7.3" transform="translate(-14.5,27.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L86,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="78" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">端口开放制度</tspan>
        </text>
    </g>
    <g id="310" ed:parentid="301" transform="translate(1188,238.6)" ed:width="268" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="284" stroke-linecap="round" d="M-14.5,-7.3C-1.2,-7.3,1.8,7.3,14.5,7.3" transform="translate(-14.5,13.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L268,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="260" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">自动化端口扫描，集成值自动化安全扫描平台</tspan>
        </text>
    </g>
    <g id="311" ed:parentid="302" transform="translate(1162,267.8)" ed:width="125" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="285" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L125,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="117" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">自动化域名安全评估</tspan>
        </text>
    </g>
    <g id="312" ed:parentid="303" transform="translate(1266,297)" ed:width="177" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="286" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L177,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="169" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">流量劫持安全监测系统或服务</tspan>
        </text>
    </g>
    <g id="313" ed:parentid="304" transform="translate(1175,326.2)" ed:width="231" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="287" stroke-linecap="round" d="M-14.5,21.9C2,21.9,-5.5,-21.9,14.5,-21.9" transform="translate(-14.5,42.4)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L231,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="223" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">DDOS攻击安全应急响应预案与定期演练</tspan>
        </text>
    </g>
    <g id="314" ed:parentid="304" transform="translate(1175,355.4)" ed:width="154" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="288" stroke-linecap="round" d="M-14.5,7.3C-1.2,7.3,1.8,-7.3,14.5,-7.3" transform="translate(-14.5,27.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L154,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="146" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">DDOS、CC攻击检测与防御</tspan>
        </text>
    </g>
    <g id="315" ed:parentid="304" transform="translate(1175,384.6)" ed:width="140" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="289" stroke-linecap="round" d="M-14.5,-7.3C-1.2,-7.3,1.8,7.3,14.5,7.3" transform="translate(-14.5,13.2)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L140,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="132" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">NSDS网络入侵监测系统</tspan>
        </text>
    </g>
    <g id="316" ed:parentid="304" transform="translate(1175,413.8)" ed:width="60" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="290" stroke-linecap="round" d="M-14.5,-21.9C2,-21.9,-5.5,21.9,14.5,21.9" transform="translate(-14.5,-1.4)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L60,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="52" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">蜜罐系统</tspan>
        </text>
    </g>
    <g id="317" ed:parentid="305" transform="translate(1162,443)" ed:width="177" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="291" stroke-linecap="round" d="M-14.5,14.6C0.5,14.6,-2,-14.6,14.5,-14.6" transform="translate(-14.5,35.1)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L177,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="169" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">网络设备安全加固与安全审计</tspan>
        </text>
    </g>
    <g id="318" ed:parentid="305" transform="translate(1162,472.2)" ed:width="294" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="292" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L294,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="286" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">网络设备安全漏洞预警，集成至安全情报收集平台</tspan>
        </text>
    </g>
    <g id="319" ed:parentid="305" transform="translate(1162,501.4)" ed:width="359" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="293" stroke-linecap="round" d="M-14.5,-14.6C0.5,-14.6,-2,14.6,14.5,14.6" transform="translate(-14.5,5.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L359,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="351" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">网络设备日志安全分析与审计，集成至统一日志安全分析平台</tspan>
        </text>
    </g>
    <g id="340" ed:parentid="280" transform="translate(956,589)" ed:width="216" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="348" stroke-linecap="round" d="M-14.5,7.3C-1.2,7.3,1.8,-7.3,14.5,-7.3" transform="translate(-14.5,27.8)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L216,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="208" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">主机漏洞扫描、安全加固及安全审计</tspan>
        </text>
    </g>
    <g id="341" ed:parentid="280" transform="translate(956,676.6)" ed:width="242" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="349" stroke-linecap="round" d="M-14.5,-36.5C4.4,-36.5,-11.2,36.5,14.5,36.5" transform="translate(-14.5,-16)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L242,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="234" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">主机层面入侵检测与安全防护、态势感知</tspan>
        </text>
    </g>
    <g id="342" ed:parentid="340" transform="translate(1201,530.6)" ed:width="216" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="334" stroke-linecap="round" d="M-14.5,29.2C3.3,29.2,-8.6,-29.2,14.5,-29.2" transform="translate(-14.5,49.7)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L216,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="208" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">主机漏洞扫描、安全加固及安全审计</tspan>
        </text>
    </g>
    <g id="343" ed:parentid="340" transform="translate(1201,559.8)" ed:width="112" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="335" stroke-linecap="round" d="M-14.5,14.6C0.5,14.6,-2,-14.6,14.5,-14.6" transform="translate(-14.5,35.1)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L112,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="104" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">各类安全加固规范</tspan>
        </text>
    </g>
    <g id="344" ed:parentid="340" transform="translate(1201,589)" ed:width="112" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="336" stroke-linecap="round" d="M-14.5,-0C-2.9,-0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L112,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="104" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">安全基线检测系统</tspan>
        </text>
    </g>
    <g id="345" ed:parentid="340" transform="translate(1201,618.2)" ed:width="125" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="337" stroke-linecap="round" d="M-14.5,-14.6C0.5,-14.6,-2,14.6,14.5,14.6" transform="translate(-14.5,5.9)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L125,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="117" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">自动化安全加固系统</tspan>
        </text>
    </g>
    <g id="346" ed:parentid="340" transform="translate(1201,647.4)" ed:width="47" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="338" stroke-linecap="round" d="M-14.5,-29.2C3.3,-29.2,-8.6,29.2,14.5,29.2" transform="translate(-14.5,-8.7)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L47,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="39" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">堡垒机</tspan>
        </text>
    </g>
    <g id="347" ed:parentid="341" transform="translate(1227,676.6)" ed:width="140" ed:height="20.5" ed:layout="rightmap">
        <path stroke="#4486b1" fill="none" id="339" stroke-linecap="round" d="M-14.5,0C-2.9,0,5.8,0,14.5,0" transform="translate(-14.5,20.5)" stroke-linejoin="round"/>
        <path stroke="#4486b1" fill="none" d="M0,20.5L140,20.5" stroke-linejoin="round"/>
        <text class="st8">
            <tspan textLength="132" style="white-space:pre" x="4" lengthAdjust="spacing" y="15.8">HIDS主机入侵监测系统</tspan>
        </text>
    </g>
    <g id="101" transform="translate(153,980.65)" ed:width="400" ed:height="84" ed:layout="map" ed:topictype="mainidea">
        <path stroke-width="3" fill="#eaf3fc" stroke="#4486b1" d="M8,0L392,0C396.4,0,400,3.6,400,8L400,76C400,80.4,396.4,84,392,84L8,84C3.6,84,0,80.4,0,76L0,8C0,3.6,3.6,0,8,0z" stroke-linejoin="round"/>
        <text class="st9">
            <tspan style="white-space:pre" x="162" y="38.5">企业安全</tspan>
            <tspan style="white-space:pre" x="26" y="60.5">参考：http://www.secsky.cn/594.html</tspan>
        </text>
    </g>
    <g transform="translate(554,1016.65)" ed:togtopicid="101">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(724,1016.65)" ed:togtopicid="102">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(839,418.05)" ed:togtopicid="106">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(813,958.25)" ed:togtopicid="108">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(813,1425.45)" ed:togtopicid="110">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(813,1761.25)" ed:togtopicid="112">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1118,724.65)" ed:togtopicid="132">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1145,870.65)" ed:togtopicid="134">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1209,1031.25)" ed:togtopicid="136">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1118,1148.05)" ed:togtopicid="138">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1071,1250.25)" ed:togtopicid="140">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1058,1308.65)" ed:togtopicid="142">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1149,1352.45)" ed:togtopicid="144">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1175,1498.45)" ed:togtopicid="152">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(967,1586.05)" ed:togtopicid="154">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1125,1659.05)" ed:togtopicid="156">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1032,1775.85)" ed:togtopicid="158">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(941,1878.05)" ed:togtopicid="160">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(928,345.05)" ed:togtopicid="278">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(928,607.85)" ed:togtopicid="280">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1056,184.45)" ed:togtopicid="300">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1160,228.25)" ed:togtopicid="301">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1134,272.05)" ed:togtopicid="302">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1238,301.25)" ed:togtopicid="303">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1147,374.25)" ed:togtopicid="304">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1134,476.45)" ed:togtopicid="305">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1173,593.25)" ed:togtopicid="340">
        <use xlink:href="#minus"/>
    </g>
    <g transform="translate(1199,680.85)" ed:togtopicid="341">
        <use xlink:href="#minus"/>
    </g>
    <symbol id="plus">
        <path fill="url(#lg3)" d="M11,6C11,8.8,8.8,11,6,11C3.2,11,1,8.8,1,6C1,3.2,3.2,1,6,1C8.8,1,11,3.2,11,6z"/>
        <path fill="none" stroke="#46a000" d="M11,6C11,8.8,8.8,11,6,11C3.2,11,1,8.8,1,6C1,3.2,3.2,1,6,1C8.8,1,11,3.2,11,6zM3,6L9,6M6,3L6,9"/>
    </symbol>
    <symbol id="minus">
        <path fill="url(#lg3)" d="M11,6C11,8.8,8.8,11,6,11C3.2,11,1,8.8,1,6C1,3.2,3.2,1,6,1C8.8,1,11,3.2,11,6z"/>
        <path fill="none" stroke="#46a000" d="M11,6C11,8.8,8.8,11,6,11C3.2,11,1,8.8,1,6C1,3.2,3.2,1,6,1C8.8,1,11,3.2,11,6zM3,6L9,6"/>
    </symbol>
</svg>
</div>
        <div id="copyright">Created With  <a href="https://www.edrawsoft.com/" target="_blank" title="edrawsoft">MindMaster</a></div>
      </div>
    </div>
    <script>eval(atob('dmFyIG11YT13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDsNCnZhciB1YT0obXVhLmluZGV4T2YoJ3J2OjExJykrbXVhLmluZGV4T2YoJ01TSUUnKSk+PTA7DQpOdW1iZXIucHJvdG90eXBlLnRvc3VpdHN2Zz1mdW5jdGlvbiAoKSB7DQogICAgdmFyIG51bT10aGlzLnZhbHVlT2YoKTsNCiAgICBpZihudW0lMT09PTApew0KICAgICAgICByZXR1cm4gbnVtKzAuNQ0KICAgIH1lbHNlIHJldHVybiBudW07DQp9Ow0KTnVtYmVyLnByb3RvdHlwZS5wbHVzej1mdW5jdGlvbigpIHsNCiAgICB2YXIgbnVtPXRoaXMudmFsdWVPZigpOw0KICAgIHJldHVybiBudW08MTA/JzAnK251bTpudW07DQp9Ow0KZnVuY3Rpb24gcGFyc2VEYXRlKG51bSkgew0KICAgIHZhciBkYXRlID0gbmV3IERhdGUobnVtKTsNCiAgICB2YXIgWSA9IGRhdGUuZ2V0RnVsbFllYXIoKSArICctJzsNCiAgICB2YXIgTSA9IChkYXRlLmdldE1vbnRoKCkrMSkucGx1c3ooKSArICctJzsNCiAgICB2YXIgRCA9IGRhdGUuZ2V0RGF0ZSgpLnBsdXN6KCkgKyAnICc7DQogICAgdmFyIGggPSBkYXRlLmdldEhvdXJzKCkucGx1c3ooKSArICc6JzsNCiAgICB2YXIgbW0gPSBkYXRlLmdldE1pbnV0ZXMoKS5wbHVzeigpICsgJzonOw0KICAgIHZhciBzID0gZGF0ZS5nZXRTZWNvbmRzKCkucGx1c3ooKTsNCiAgICByZXR1cm4gWStNK0QraCttbStzOw0KfQ0KLy8tLXByZWRlZmluZWQNCi8vY29tbWVudC0tDQp2YXIgY29tbWVudHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZz5nW2VkXFw6Y29tbWVudF0nKTsNCmZ1bmN0aW9uIGdldGN3aChwb3B1cCkgew0KICAgIGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3N2ZycpWzBdLmFwcGVuZENoaWxkKHBvcHVwKTsNCiAgICB2YXIgdz1wb3B1cC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDsNCiAgICB2YXIgaD1wb3B1cC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7DQogICAgcmV0dXJuIFt3LGhdDQp9DQpmb3IodmFyIGk9MDtpPGNvbW1lbnRzLmxlbmd0aDtpKyspew0KICAgIHZhciBwb3B1cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywnZycpOw0KICAgIHZhciBob3Zlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywncmVjdCcpOw0KICAgIHZhciBvbGluZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywncmVjdCcpOw0KICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnZmlsbCcsJyNjZGNkZmYnKTsNCiAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3gnLCcwJyk7DQogICAgaG92ZXIuc2V0QXR0cmlidXRlKCd5JywnMCcpOw0KICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywnMTYnKTsNCiAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywnMTYnKTsNCiAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsJzAuNicpOw0KICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJyxjb21tZW50c1tpXS5xdWVyeVNlbGVjdG9yKCd1c2UnKS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpKTsNCiAgICBob3Zlci5zdHlsZS5kaXNwbGF5PSdub25lJzsNCiAgICBjb21tZW50c1tpXS5hcHBlbmRDaGlsZChob3Zlcik7DQogICAgdmFyIGE9SlNPTi5wYXJzZShjb21tZW50c1tpXS5nZXRBdHRyaWJ1dGUoJ2VkOmNvbW1lbnQnKSk7DQogICAgdmFyIGhlaWdodD0wOw0KICAgIHZhciBjYXJyPVtdOw0KICAgIGZvcih2YXIgaj0wO2o8YS5sZW5ndGg7aisrKXsNCiAgICAgICAgdmFyIHN0YW1wPU51bWJlcihhW2pdLkRhdGUpKjEwMDA7DQogICAgICAgIHZhciB0aW1lPXBhcnNlRGF0ZShzdGFtcCk7DQogICAgICAgIHZhciBuYW1lPWFbal0uTmFtZTsNCiAgICAgICAgdmFyIG1lc3NhZ2U9YVtqXS5NZXNzYWdlOw0KICAgICAgICB2YXIgbWVzc2FnZUFycj1tZXNzYWdlLnNwbGl0KC9cbi8pOw0KICAgICAgICB2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywnZycpOw0KICAgICAgICB2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywndGV4dCcpOw0KICAgICAgICB2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywndGV4dCcpOw0KICAgICAgICB2YXIgbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywndGV4dCcpOw0KICAgICAgICBuLnNldEF0dHJpYnV0ZSgneCcsNSk7DQogICAgICAgIG4uc2V0QXR0cmlidXRlKCd5JywxMik7DQogICAgICAgIG4uc2V0QXR0cmlidXRlKCdmaWxsJywnIzAwNmVmZicpOw0KICAgICAgICBuLnRleHRDb250ZW50PW5hbWUrJ++8mic7DQogICAgICAgIG4uc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCcxMicpOw0KICAgICAgICB0LnNldEF0dHJpYnV0ZSgneCcsMjAwKTsNCiAgICAgICAgdC5zZXRBdHRyaWJ1dGUoJ3knLDEyKTsNCiAgICAgICAgdC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCcjOTY5Njk2Jyk7DQogICAgICAgIHQudGV4dENvbnRlbnQ9dGltZTsNCiAgICAgICAgdC5zZXRBdHRyaWJ1dGUoJ2ZvbnQtc2l6ZScsJzEwJyk7DQogICAgICAgIG0uc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCd0cmFuc2xhdGUoMjAsMjcpJyk7DQogICAgICAgIG0uc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCcxMicpOw0KICAgICAgICBmb3IodmFyIGs9MDtrPG1lc3NhZ2VBcnIubGVuZ3RoO2srKyl7DQogICAgICAgICAgICB2YXIgdHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsJ3RzcGFuJyk7DQogICAgICAgICAgICB0cy5zZXRBdHRyaWJ1dGUoJ3gnLCcwJyk7DQogICAgICAgICAgICB0cy5zZXRBdHRyaWJ1dGUoJ3knLGsqMTYpOw0KICAgICAgICAgICAgdHMudGV4dENvbnRlbnQ9bWVzc2FnZUFycltrXTsNCiAgICAgICAgICAgIG0uYXBwZW5kQ2hpbGQodHMpOw0KICAgICAgICB9DQogICAgICAgIG8uc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCd0cmFuc2xhdGUoMCwnK2hlaWdodCsnKScpOw0KICAgICAgICBvLmFwcGVuZENoaWxkKG4pOw0KICAgICAgICBvLmFwcGVuZENoaWxkKHQpOw0KICAgICAgICBvLmFwcGVuZENoaWxkKG0pOw0KICAgICAgICBjYXJyLnB1c2gobyk7DQogICAgICAgIHBvcHVwLmFwcGVuZENoaWxkKG8pOw0KICAgICAgICBoZWlnaHQ9KG1lc3NhZ2VBcnIubGVuZ3RoKzEpKjE2K2hlaWdodDsNCiAgICB9DQogICAgdmFyIHdhcnI9Z2V0Y3doKHBvcHVwKTsNCiAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ3gnLCcwJyk7DQogICAgb2xpbmUuc2V0QXR0cmlidXRlKCd5JywnMCcpOw0KICAgIHZhciBvdz13YXJyWzBdKzEwLjU7DQogICAgdmFyIG9oPXdhcnJbMV0rMzsNCiAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyxvdyk7DQogICAgb2xpbmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLG9oKTsNCiAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCd3aGl0ZScpOw0KICAgIG9saW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywnIzY1NjU2NScpOw0KICAgIHBvcHVwLmFwcGVuZENoaWxkKG9saW5lKTsNCiAgICB2YXIgbD1jYXJyLmxlbmd0aDsNCiAgICB3aGlsZShsLS0pew0KICAgICAgICBwb3B1cC5hcHBlbmRDaGlsZChjYXJyW2xdKTsNCiAgICB9DQogICAgcG9wdXAub25tb3VzZW92ZXI9ZnVuY3Rpb24gKCkgew0KICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsNCiAgICB9Ow0KICAgIHBvcHVwLm9ubW91c2VvdXQ9ZnVuY3Rpb24gKCkgew0KICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgfTsNCiAgICB2YXIgY3M9Y29tbWVudHNbaV0ucXVlcnlTZWxlY3RvcigndXNlJykuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKS5tYXRjaCgvXCgoXFMqfFxTKlxzXFMqKVwpLylbMV0uc3BsaXQoLyB8LC8pOw0KICAgIHZhciBwcz1jb21tZW50c1tpXS5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykubWF0Y2goL1woKFxTKnxcUypcc1xTKilcKS8pWzFdLnNwbGl0KC8gfCwvKTsNCiAgICB2YXIgeD1wYXJzZUZsb2F0KGNzWzBdKStwYXJzZUZsb2F0KHBzWzBdKTsNCiAgICB2YXIgeT1wYXJzZUZsb2F0KHBzWzFdKTsNCiAgICB4PXgudG9zdWl0c3ZnKCk7DQogICAgeT15LnRvc3VpdHN2ZygpOw0KICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywndHJhbnNsYXRlKCcreCsnLCcreSsnKScpOw0KICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnY29tbWVudCcsJycpOw0KICAgIHBvcHVwLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnZWQ6Y29tbWVudGlkJyxjb21tZW50c1tpXS5wYXJlbnROb2RlLmlkKTsNCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3ZnLWNvbnRhaW5lciA+IHN2ZycpLmFwcGVuZENoaWxkKHBvcHVwKTsNCiAgICBjb21tZW50c1tpXS5vbm1vdXNlb3Zlcj1mdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBjb21tZW50aWQ9dGhpcy5wYXJlbnROb2RlLmlkOw0KICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7DQogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDpjb21tZW50aWQ9JyIrY29tbWVudGlkKyInXVtjb21tZW50XSIpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsNCiAgICB9Ow0KICAgIGNvbW1lbnRzW2ldLm9ubW91c2VvdXQ9ZnVuY3Rpb24gKCkgew0KICAgICAgICB2YXIgY29tbWVudGlkPXRoaXMucGFyZW50Tm9kZS5pZDsNCi8vICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7DQogICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcigncmVjdCcpLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6Y29tbWVudGlkPSciK2NvbW1lbnRpZCsiJ11bY29tbWVudF0iKS5zdHlsZS5kaXNwbGF5PSdub25lJzsNCiAgICB9DQp9DQovLy0tY29tbWVudA0KLy9ub3RlLS0NCmlmKCF1YSl7DQogICAgdmFyIG5vdGVzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2c+Z1tlZFxcOm5vdGVdJyk7DQogICAgZnVuY3Rpb24gZ2V0d2gocyxwKSB7DQogICAgICAgIHZhciBtYWlucD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgbWFpbnAuc3R5bGUuY3NzVGV4dD1zOw0KICAgICAgICBtYWlucC5zdHlsZS5kaXNwbGF5PSdpbmxpbmUtYmxvY2snOw0KICAgICAgICBtYWlucC5pbm5lckhUTUw9cDsNCiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtYWlucCk7DQogICAgICAgIHZhciB3PW1haW5wLmNsaWVudFdpZHRoOw0KICAgICAgICB2YXIgaD1tYWlucC5jbGllbnRIZWlnaHQ7DQogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobWFpbnApOw0KICAgICAgICByZXR1cm4gW3csaF0NCiAgICB9DQogICAgZm9yKHZhciBpPTA7aTxub3Rlcy5sZW5ndGg7aSsrKXsNCiAgICAgICAgdmFyIGE9bm90ZXNbaV0uZ2V0QXR0cmlidXRlKCdlZDpub3RlJyk7DQogICAgICAgIHZhciBtYWlucD1hLm1hdGNoKC88cChbXFNcc10qKTxcL3A+L2cpWzBdOw0KICAgICAgICB2YXIgbWFpbnM9YS5tYXRjaCgvc3R5bGU9IiguKj8pIi8pWzFdOw0KICAgICAgICB2YXIgb3V0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCdnJyk7DQogICAgICAgIHZhciBvbGluZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywncmVjdCcpOw0KICAgICAgICB2YXIgcG9wdXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsJ2ZvcmVpZ25PYmplY3QnKTsNCiAgICAgICAgdmFyIGhvdmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCdyZWN0Jyk7DQogICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnZmlsbCcsJyNjZGNkZmYnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd4JywnMCcpOw0KICAgICAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3knLCcwJyk7DQogICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywnMTYnKTsNCiAgICAgICAgaG92ZXIuc2V0QXR0cmlidXRlKCd3aWR0aCcsJzE2Jyk7DQogICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgnZmlsbC1vcGFjaXR5JywnMC42Jyk7DQogICAgICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJyxub3Rlc1tpXS5xdWVyeVNlbGVjdG9yKCd1c2UnKS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpKTsNCiAgICAgICAgaG92ZXIuc3R5bGUuZGlzcGxheT0nbm9uZSc7DQogICAgICAgIG5vdGVzW2ldLmFwcGVuZENoaWxkKGhvdmVyKTsNCiAgICAgICAgcG9wdXAuc3R5bGUuY3NzVGV4dD1tYWluczsNCiAgICAgICAgcG9wdXAuaW5uZXJIVE1MPW1haW5wOw0KICAgICAgICB2YXIgd2g9Z2V0d2gobWFpbnMsbWFpbnApOw0KICAgICAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyx3aFswXSsxNik7DQogICAgICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jyx3aFsxXSs4KTsNCiAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCd0cmFuc2xhdGUoOCw0KScpOw0KICAgICAgICBwb3B1cC5zdHlsZS50ZXh0QWxpZ249J2xlZnQnOw0KICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ3gnLCcwJyk7DQogICAgICAgIG9saW5lLnNldEF0dHJpYnV0ZSgneScsJzAnKTsNCiAgICAgICAgb2xpbmUuc2V0QXR0cmlidXRlKCd3aWR0aCcsd2hbMF0rMTYpOw0KICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsd2hbMV0rOCk7DQogICAgICAgIG9saW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywnI2EyN2EwMCcpOw0KICAgICAgICBvbGluZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCcjZmZlNzlkJyk7DQogICAgICAgIG91dC5hcHBlbmRDaGlsZChvbGluZSk7DQogICAgICAgIG91dC5hcHBlbmRDaGlsZChwb3B1cCk7DQogICAgICAgIG91dC5zZXRBdHRyaWJ1dGUoJ25vdGUnLCcnKTsNCiAgICAgICAgb3V0LnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KICAgICAgICBvdXQuc2V0QXR0cmlidXRlKCdlZDpub3RlaWQnLG5vdGVzW2ldLnBhcmVudE5vZGUuaWQpOw0KICAgICAgICBvdXQub25tb3VzZW92ZXI9ZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5PSdibG9jayc7DQogICAgICAgIH07DQogICAgICAgIG91dC5vbm1vdXNlb3V0PWZ1bmN0aW9uICgpIHsNCi8vICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uID8gd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZVJhbmdlKHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZSk6ZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCk7DQoNCiAgICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSc7DQogICAgICAgIH07DQogICAgICAgIHZhciBjcz1ub3Rlc1tpXS5xdWVyeVNlbGVjdG9yKCd1c2UnKS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpLm1hdGNoKC9cKChcUyp8XFMqXHNcUyopXCkvKVsxXS5zcGxpdCgvIHwsLyk7DQogICAgICAgIHZhciBwcz1ub3Rlc1tpXS5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykubWF0Y2goL1woKFxTKnxcUypcc1xTKilcKS8pWzFdLnNwbGl0KC8gfCwvKTsNCiAgICAgICAgdmFyIHg9cGFyc2VGbG9hdChjc1swXSkrcGFyc2VGbG9hdChwc1swXSk7DQogICAgICAgIHZhciB5PXBhcnNlRmxvYXQocHNbMV0pOw0KICAgICAgICB4PXgudG9zdWl0c3ZnKCk7DQogICAgICAgIHk9eS50b3N1aXRzdmcoKTsNCiAgICAgICAgb3V0LnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywndHJhbnNsYXRlKCcreCsnLCcreSsnKScpOw0KICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3ZnLWNvbnRhaW5lciA+IHN2ZycpLmFwcGVuZENoaWxkKG91dCk7DQogICAgICAgIG5vdGVzW2ldLm9ubW91c2VvdmVyPWZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBub3RlaWQ9dGhpcy5wYXJlbnROb2RlLmlkOw0KICAgICAgICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKCdyZWN0Jykuc3R5bGUuZGlzcGxheT0nYmxvY2snOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOm5vdGVpZD0nIitub3RlaWQrIiddW25vdGVdIikuc3R5bGUuZGlzcGxheT0nYmxvY2snOw0KICAgICAgICB9Ow0KICAgICAgICBub3Rlc1tpXS5vbm1vdXNlb3V0PWZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBub3RlaWQ9dGhpcy5wYXJlbnROb2RlLmlkOw0KLy8gICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTsNCiAgICAgICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcigncmVjdCcpLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOm5vdGVpZD0nIitub3RlaWQrIiddW25vdGVdIikuc3R5bGUuZGlzcGxheT0nbm9uZSc7DQogICAgICAgIH0NCiAgICB9DQp9ZWxzZXsNCiAgICBjb25zb2xlLmxvZygn5oqx5q2J77yMSUXmtY/op4jlmajkuI3mlK/mjIFub3Rl6Kej5p6Q77yM6K+35L2/55So5YW25LuW5YaF5qC45rWP6KeI5Zmo44CC6LCi6LCi77yBJykNCn0NCi8vLS1ub3RlDQovL2h5cGVybGluay0tDQp2YXIgbGlua3M9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZz5nW2VkXFw6aHlwZXJsaW5rXScpOw0KZnVuY3Rpb24gZ2V0bWF4bGVuKGFycixicnIpIHsNCiAgICB2YXIgbD0wOw0KICAgIHZhciBsbD0wOw0KICAgIGZvcih2YXIgaj0wO2o8YXJyLmxlbmd0aDtqKyspew0KICAgICAgICB2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywndGV4dCcpOw0KICAgICAgICBpZighaXNOYU4obGlua2FycltqXSkpew0KICAgICAgICAgICAgZS50ZXh0Q29udGVudD0nUGFnZS0nK2FycltqXTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBlLnRleHRDb250ZW50PWFycltqXTsNCiAgICAgICAgfQ0KICAgICAgICBlLnN0eWxlLmZvbnRTaXplPScxMnB4JzsNCiAgICAgICAgZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJylbMF0uYXBwZW5kQ2hpbGQoZSk7DQogICAgICAgIHZhciBldz1lLmdldEJCb3goKS53aWR0aDsNCiAgICAgICAgZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJylbMF0ucmVtb3ZlQ2hpbGQoZSk7DQogICAgICAgIHZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCd0ZXh0Jyk7DQogICAgICAgIGgudGV4dENvbnRlbnQ9YnJyW2pdOw0KICAgICAgICBoLnN0eWxlLmZvbnRTaXplPScxMnB4JzsNCiAgICAgICAgaC5zdHlsZS5mb250V2VpZ2h0PSdib2xkJzsNCiAgICAgICAgZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJylbMF0uYXBwZW5kQ2hpbGQoaCk7DQogICAgICAgIHZhciBodz1oLmdldEJCb3goKS53aWR0aDsNCiAgICAgICAgZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJylbMF0ucmVtb3ZlQ2hpbGQoaCk7DQogICAgICAgIGw9ZXc+aHc/ZXc6aHc7DQogICAgICAgIGxsPWw+bGw/bDpsbDsNCiAgICB9DQogICAgcmV0dXJuIGxsOw0KfQ0KZm9yKHZhciBpPTA7aTxsaW5rcy5sZW5ndGg7aSsrKXsNCiAgICB2YXIgcG9wdXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsJ2cnKTsNCiAgICB2YXIgaG92ZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsJ3JlY3QnKTsNCiAgICB2YXIgZGVzY2Fycj1bXTsNCiAgICB2YXIgbGlua2Fycj1bXTsNCiAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCcjY2RjZGZmJyk7DQogICAgaG92ZXIuc2V0QXR0cmlidXRlKCd4JywnMCcpOw0KICAgIGhvdmVyLnNldEF0dHJpYnV0ZSgneScsJzAnKTsNCiAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsJzE2Jyk7DQogICAgaG92ZXIuc2V0QXR0cmlidXRlKCd3aWR0aCcsJzE2Jyk7DQogICAgaG92ZXIuc2V0QXR0cmlidXRlKCdmaWxsLW9wYWNpdHknLCcwLjYnKTsNCiAgICBob3Zlci5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsbGlua3NbaV0ucXVlcnlTZWxlY3RvcigndXNlJykuZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKSk7DQogICAgaG92ZXIuc3R5bGUuZGlzcGxheT0nbm9uZSc7DQogICAgbGlua3NbaV0uYXBwZW5kQ2hpbGQoaG92ZXIpOw0KICAgIC8vIGNvbnNvbGUubG9nKGxpbmtzW2ldLmdldEF0dHJpYnV0ZSgnZWQ6aHlwZXJsaW5rJykpOw0KICAgIHZhciBhPUpTT04ucGFyc2UobGlua3NbaV0uZ2V0QXR0cmlidXRlKCdlZDpoeXBlcmxpbmsnKSk7DQogICAgdmFyIGNzPWxpbmtzW2ldLnF1ZXJ5U2VsZWN0b3IoJ3VzZScpLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykubWF0Y2goL1woKFxTKnxcUypcc1xTKilcKS8pWzFdLnNwbGl0KC8gfCwvKTsNCiAgICB2YXIgcHM9bGlua3NbaV0ucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpLm1hdGNoKC9cKChcUyp8XFMqXHNcUyopXCkvKVsxXS5zcGxpdCgvIHwsLyk7DQogICAgdmFyIHg9cGFyc2VGbG9hdChjc1swXSkrcGFyc2VGbG9hdChwc1swXSk7DQogICAgdmFyIHk9cGFyc2VGbG9hdChwc1sxXSk7DQogICAgeD14LnRvc3VpdHN2ZygpOw0KICAgIHk9eS50b3N1aXRzdmcoKTsNCiAgICB2YXIgYWw9YS5sZW5ndGg7DQogICAgZm9yKHZhciBqPTA7ajxhbDtqKyspew0KICAgICAgICBsaW5rYXJyLnB1c2goYVtqXS5saW5rKTsNCiAgICAgICAgZGVzY2Fyci5wdXNoKGFbal0uZGVzYyk7DQogICAgfQ0KICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywndHJhbnNsYXRlKCcreCsnLCcreSsnKScpOw0KICAgIHZhciBtYXg9Z2V0bWF4bGVuKGxpbmthcnIsZGVzY2Fycik7DQogICAgZm9yKHZhciBrPTA7azxhbDtrKyspew0KICAgICAgICB2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywnYScpOw0KICAgICAgICB2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywncmVjdCcpOw0KICAgICAgICB2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywndGV4dCcpOw0KICAgICAgICB2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywndGV4dCcpOw0KICAgICAgICBpZihpc05hTihsaW5rYXJyW2tdKSl7DQogICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnaHJlZicsbGlua2FycltrXSk7DQogICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywnX2JsYW5rJyk7DQogICAgICAgICAgICBlLnRleHRDb250ZW50PWxpbmthcnJba107DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgZS50ZXh0Q29udGVudD0nUGFnZS0nK2xpbmthcnJba107DQogICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnaHJlZicsJyMnK2xpbmthcnJba10pOw0KICAgICAgICB9DQogICAgICAgIGQuc2V0QXR0cmlidXRlKCd3aWR0aCcsbWF4KzEwKTsNCiAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsJzMzJyk7DQogICAgICAgIGQuc2V0QXR0cmlidXRlKCdzdHJva2UnLCcjOTk5OTk5Jyk7DQogICAgICAgIGQuc2V0QXR0cmlidXRlKCdmaWxsJywnd2hpdGUnKTsNCiAgICAgICAgZC5zZXRBdHRyaWJ1dGUoJ3knLDMzKmspOw0KICAgICAgICBmLnRleHRDb250ZW50PWRlc2NhcnJba107DQogICAgICAgIGYuc3R5bGUuZm9udFNpemU9JzEycHgnOw0KICAgICAgICBmLnN0eWxlLmZvbnRXZWlnaHQ9J2JvbGQnOw0KICAgICAgICBmLnNldEF0dHJpYnV0ZSgneCcsNSk7DQogICAgICAgIGYuc2V0QXR0cmlidXRlKCd5JywzMyprKzEyKTsNCiAgICAgICAgZS5zdHlsZS5mb250U2l6ZT0nMTJweCc7DQogICAgICAgIGUuc2V0QXR0cmlidXRlKCd5JywzMyprKzI4KTsNCiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3gnLDUpOw0KICAgICAgICBjLmFwcGVuZENoaWxkKGQpOw0KICAgICAgICBjLmFwcGVuZENoaWxkKGYpOw0KICAgICAgICBjLmFwcGVuZENoaWxkKGUpOw0KICAgICAgICBjLm9ubW91c2VvdmVyPWZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcigncmVjdCcpLnN0eWxlLmZpbGw9JyNlMWUxZmYnDQogICAgICAgIH07DQogICAgICAgIGMub25tb3VzZW91dD1mdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5maWxsPSd3aGl0ZScNCiAgICAgICAgfTsNCiAgICAgICAgcG9wdXAuYXBwZW5kQ2hpbGQoYyk7DQogICAgfQ0KICAgIHBvcHVwLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnaHlwZXJsaW5rJywnJyk7DQogICAgcG9wdXAuc2V0QXR0cmlidXRlKCdlZDpsaW5raWQnLGxpbmtzW2ldLnBhcmVudE5vZGUuaWQpOw0KICAgIHBvcHVwLm9ubW91c2VvdmVyPWZ1bmN0aW9uICgpIHsNCiAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5PSdibG9jayc7DQogICAgfTsNCiAgICBwb3B1cC5vbmNsaWNrPWZ1bmN0aW9uICgpIHsNCiAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5PSdub25lJzsNCiAgICB9Ow0KICAgIHBvcHVwLm9ubW91c2VvdXQ9ZnVuY3Rpb24gKCkgew0KICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnOw0KICAgIH07DQogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N2Zy1jb250YWluZXIgPiBzdmcnKS5hcHBlbmRDaGlsZChwb3B1cCk7DQogICAgbGlua3NbaV0ub25tb3VzZW92ZXI9ZnVuY3Rpb24gKCkgew0KICAgICAgICB2YXIgbGlua2lkPXRoaXMucGFyZW50Tm9kZS5pZDsNCiAgICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKCdyZWN0Jykuc3R5bGUuZGlzcGxheT0nYmxvY2snOw0KICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6bGlua2lkPSciK2xpbmtpZCsiJ11baHlwZXJsaW5rXSIpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsNCiAgICB9DQogICAgbGlua3NbaV0ub25tb3VzZW91dD1mdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciBsaW5raWQ9dGhpcy5wYXJlbnROb2RlLmlkOw0KICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsNCiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOmxpbmtpZD0nIitsaW5raWQrIiddW2h5cGVybGlua10iKS5zdHlsZS5kaXNwbGF5PSdub25lJzsNCiAgICB9DQp9DQovLy0taHlwZXJsaW5rDQovL2luaXRpYWxpemUtLQ0KdmFyIHNoYXBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2dbZWRcXDp0b2d0b3BpY2lkXScpOw0KdmFyIG1JZD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdnW2VkXFw6dG9waWN0eXBlXScpOw0KdmFyIGRhdGFUcmVlPXt9Ow0KdmFyIGV4dHJhUmVsYT17fTsNCnZhciBjaGVja0lEPScnOw0KZm9yKHZhciBpPTA7aTxtSWQubGVuZ3RoO2krKyl7DQogICAgdmFyIHR5cGU9bUlkW2ldLmdldEF0dHJpYnV0ZSgnZWQ6dG9waWN0eXBlJyk7DQogICAgdmFyIHNpZD1tSWRbaV0uaWQ7DQogICAgaWYodHlwZSE9PSdjYWxsb3V0Jyl7DQogICAgICAgIGluaXQoc2lkLGRhdGFUcmVlKQ0KICAgIH0NCn0NCmZ1bmN0aW9uIGluaXQoaWQsIG9iaikgew0KICAgIHZhciBjaGlsZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJnW2VkXFw6cGFyZW50aWQ9JyIgKyBpZCArICInXTpub3QoW2VkXFw6dG9waWN0eXBlXSkiKTsNCiAgICB2YXIgY2FsbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJnW2VkXFw6cGFyZW50aWQ9JyIgKyBpZCArICInXVtlZFxcOnRvcGljdHlwZV0iKTsNCiAgICB2YXIgc3VtbWFyeSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInBhdGhbZWRcXDpwYXJlbnRpZCo9JyIgKyBpZCArICInXVtlZFxcOnR5cGU9J3N1bW1hcnknXSIpOw0KICAgIHZhciBib3VuZGFyeT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgicGF0aFtlZFxcOnBhcmVudGlkKj0nIiArIGlkICsgIiddW2VkXFw6dHlwZT0nYm91bmRhcnknXSIpOw0KICAgIHZhciByZWxhZnJvbT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJnW2VkXFw6ZnJvbWlkKj0nIiArIGlkICsgIiddW2VkXFw6dHlwZT0ncmVsYXRpb24nXSIpOw0KICAgIHZhciByZWxhdG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiZ1tlZFxcOnRvaWQqPSciICsgaWQgKyAiJ11bZWRcXDp0eXBlPSdyZWxhdGlvbiddIik7DQogICAgb2JqWyJtIiArIGlkXSA9IHt9Ow0KICAgIHZhciB0eXBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmdldEF0dHJpYnV0ZSgnZWQ6dG9waWN0eXBlJyk7DQogICAgdmFyIGl3PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5nZXRBdHRyaWJ1dGUoJ2VkOndpZHRoJyk7DQogICAgdmFyIGloPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5nZXRBdHRyaWJ1dGUoJ2VkOmhlaWdodCcpOw0KICAgIGlmICh0eXBlKSB7DQogICAgICAgIG9ialsibSIgKyBpZF0udHlwZSA9IHR5cGU7DQogICAgfQ0KICAgIGlmKGl3JiZpaCl7DQogICAgICAgIG9ialsibSIgKyBpZF0ud2lkdGggPWl3Ow0KICAgICAgICBvYmpbIm0iICsgaWRdLmhlaWdodCA9aWg7DQogICAgfQ0KICAgIGlmIChyZWxhZnJvbS5sZW5ndGggIT09IDApIHsNCiAgICAgICAgb2JqWyJtIiArIGlkXS5yZWxhZnJvbSA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbGFmcm9tLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgaW5kZXhpZCA9IHJlbGFmcm9tW2ldLmlkOw0KICAgICAgICAgICAgdmFyIHRvaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbmRleGlkKS5nZXRBdHRyaWJ1dGUoJ2VkOnRvaWQnKTsNCiAgICAgICAgICAgIGlmIChleHRyYVJlbGFbaW5kZXhpZF0gPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIGV4dHJhUmVsYVtpbmRleGlkXSA9IHsNCiAgICAgICAgICAgICAgICAgICAgaWQ6IGluZGV4aWQsDQogICAgICAgICAgICAgICAgICAgIGZyb21pZDogaWQsDQogICAgICAgICAgICAgICAgICAgIHRvaWQ6IHRvaWQsDQogICAgICAgICAgICAgICAgICAgIGlzQzogZmFsc2UNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb2JqWyJtIiArIGlkXS5yZWxhZnJvbVtpbmRleGlkXT17fTsNCiAgICAgICAgICAgIG9ialsibSIgKyBpZF0ucmVsYWZyb20uZGlzcGxheT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnPydibG9jayc6J25vbmUnOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChyZWxhdG8ubGVuZ3RoICE9PSAwKSB7DQogICAgICAgIG9ialsibSIgKyBpZF0ucmVsYXRvID0ge307DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVsYXRvLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgaW5kZXhpZD1yZWxhdG9baV0uaWQ7DQogICAgICAgICAgICB2YXIgZnJvbWlkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGluZGV4aWQpLmdldEF0dHJpYnV0ZSgnZWQ6ZnJvbWlkJyk7DQogICAgICAgICAgICBpZihleHRyYVJlbGFbaW5kZXhpZF0gPT09IHVuZGVmaW5lZCl7DQogICAgICAgICAgICAgICAgZXh0cmFSZWxhW2luZGV4aWRdPXsNCiAgICAgICAgICAgICAgICAgICAgaWQ6aW5kZXhpZCwNCiAgICAgICAgICAgICAgICAgICAgZnJvbWlkOmZyb21pZCwNCiAgICAgICAgICAgICAgICAgICAgdG9pZDppZCwNCiAgICAgICAgICAgICAgICAgICAgaXNDOmZhbHNlDQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG9ialsibSIgKyBpZF0ucmVsYXRvW2luZGV4aWRdPXt9Ow0KICAgICAgICAgICAgb2JqWyJtIiArIGlkXS5yZWxhdG8uZGlzcGxheT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnPydibG9jayc6J25vbmUnOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChjaGlsZHMubGVuZ3RoICE9PSAwKSB7DQogICAgICAgIG9ialsibSIgKyBpZF0uY2hpbGQgPSB7fTsNCiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDp0b2d0b3BpY2lkPSciICsgaWQgKyAiJ10iKSkgew0KICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOnRvZ3RvcGljaWQ9JyIgKyBpZCArICInXSIpLmNoaWxkTm9kZXNbMF0uZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJykpOw0KICAgICAgICAgICAgdmFyIHRvZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDp0b2d0b3BpY2lkPSciICsgaWQgKyAiJ10iKS5jaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnKS5zbGljZSgxKTsNCiAgICAgICAgICAgIG9ialsibSIgKyBpZF0udG9ndHlwZSA9IHRvZzsNCiAgICAgICAgfQ0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGNpZCA9IGNoaWxkc1tpXS5pZDsNCiAgICAgICAgICAgIGluaXQoY2lkLCBvYmpbIm0iICsgaWRdLmNoaWxkKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoY2FsbHMubGVuZ3RoICE9PSAwKSB7DQogICAgICAgIG9ialsibSIgKyBpZF0uY2FsbCA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgY2lkID0gY2FsbHNbaV0uaWQ7DQogICAgICAgICAgICBpbml0KGNpZCwgb2JqWyJtIiArIGlkXS5jYWxsKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoYm91bmRhcnkubGVuZ3RoICE9PSAwKSB7DQogICAgICAgIG9ialsibSIgKyBpZF0uYm91bmRhcnkgPSB7fTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3VuZGFyeS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGNpZCA9Ym91bmRhcnlbaV0uaWQ7DQogICAgICAgICAgICBpbml0KGNpZCwgb2JqWyJtIiArIGlkXS5ib3VuZGFyeSk7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKHN1bW1hcnkubGVuZ3RoICE9PSAwKSB7DQogICAgICAgIG9ialsibSIgKyBpZF0uc3VtbWFyeSA9IHt9Ow0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1bW1hcnkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjaWQgPSBzdW1tYXJ5W2ldLmlkOw0KICAgICAgICAgICAgaW5pdChjaWQsIG9ialsibSIgKyBpZF0uc3VtbWFyeSk7DQogICAgICAgIH0NCiAgICB9DQp9DQovLy0taW5pdGlhbGl6ZQ0KLy90b2dnbGVkaXNwbGF5LS0NCnZhciBjaGFpbkFycj1bXTsNCmZ1bmN0aW9uIGdldGNoYWluKGlkKXsNCiAgICBjaGFpbkFyci51bnNoaWZ0KCdtJytpZCk7DQogICAgdmFyIHBhcmVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuZ2V0QXR0cmlidXRlKCdlZDpwYXJlbnRpZCcpOw0KICAgIGlmKCFwYXJlbnQpew0KICAgICAgICByZXR1cm47DQogICAgfQ0KICAgIGdldGNoYWluKHBhcmVudCk7DQp9DQpmdW5jdGlvbiBnZXRvYmooaWQpIHsNCiAgICBjaGFpbkFycj1bXTsNCiAgICBnZXRjaGFpbihpZCk7DQogICAgdmFyIG1haW49Y2hhaW5BcnJbMF07DQogICAgaWYoY2hhaW5BcnIubGVuZ3RoPjEpew0KICAgICAgICB2YXIgb2JqPWRhdGFUcmVlW21haW5dOw0KICAgICAgICAvLyBjb25zb2xlLmxvZyhjaGFpbkFycik7DQogICAgICAgIGZvcih2YXIgaT0xO2k8Y2hhaW5BcnIubGVuZ3RoO2krKykgew0KICAgICAgICAgICAgdmFyIGEgPSBjaGFpbkFycltpXTsNCiAgICAgICAgICAgIGZvcih2YXIgaj0wO2o8T2JqZWN0LmtleXMob2JqKS5sZW5ndGg7aisrKXsNCiAgICAgICAgICAgICAgICB2YXIgY29iaj0gb2JqW09iamVjdC5rZXlzKG9iailbal1dW2FdOw0KICAgICAgICAgICAgICAgIGlmKGNvYmopew0KICAgICAgICAgICAgICAgICAgICBvYmo9Y29iajsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG9iag0KICAgIH1lbHNlew0KICAgICAgICB2YXIgb2JqPWRhdGFUcmVlW21haW5dOw0KICAgICAgICByZXR1cm4gb2JqDQogICAgfQ0KDQp9DQpmb3IodmFyIGk9MDtpPHNoYXBlLmxlbmd0aDtpKyspew0KICAgIHNoYXBlW2ldLm9uY2xpY2s9ZnVuY3Rpb24gKCkgew0KICAgICAgICB2YXIgaWQ9TnVtYmVyKHRoaXMuZ2V0QXR0cmlidXRlKCdlZDp0b2d0b3BpY2lkJykpOw0KICAgICAgICB2YXIgb2JqPWdldG9iaihpZCk7DQoNCiAgICAgICAgdmFyIHR5cGU9b2JqLnRvZ3R5cGU9PT0nbWludXMnPydwbHVzJzonbWludXMnOw0KICAgICAgICB2YXIgZGlzcGxheT1vYmoudG9ndHlwZT09PSdtaW51cyc/J25vbmUnOidibG9jayc7DQogICAgICAgIHRoaXMuY2hpbGRyZW5bMF0uc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywnIycrdHlwZSk7DQogICAgICAgIG9iai50b2d0eXBlPXR5cGU7DQogICAgICAgIGNoZWNrSUQ9b2JqOw0KDQogICAgICAgIHV0ZChvYmosaWQsZGlzcGxheSk7DQogICAgICAgIGV4dHJhUmVsYUZpbigpOw0KICAgIH0NCn0NCmZ1bmN0aW9uIHV0ZChvYmosaWQsc2hvdyxvYykgew0KDQogICAgdmFyIHBzaG93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5IT09ICdub25lJz8nYmxvY2snOidub25lJzsNCiAgICBpZiAob2JqLnJlbGFmcm9tKXsNCiAgICAgICAgaWYob2JqLnJlbGFmcm9tLmRpc3BsYXkhPT0gcHNob3cpew0KICAgICAgICAgICAgdmFyIHJlbGFmcm9tcz1PYmplY3Qua2V5cyhvYmoucmVsYWZyb20pOw0KICAgICAgICAgICAgcmVsYWZyb21zLnNwbGljZShyZWxhZnJvbXMuaW5kZXhPZignZGlzcGxheScpLDEpOw0KICAgICAgICAgICAgZm9yKHZhciBrPTA7azxyZWxhZnJvbXMubGVuZ3RoO2srKyl7DQogICAgICAgICAgICAgICAgdmFyIGQ9cmVsYWZyb21zW2tdOw0KICAgICAgICAgICAgICAgIGV4dHJhUmVsYVtkXS5pc0M9dHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG9iai5yZWxhZnJvbS5kaXNwbGF5ID0gcHNob3c7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKG9iai5yZWxhdG8pew0KICAgICAgICBpZihvYmoucmVsYXRvLmRpc3BsYXkhPT0gcHNob3cpew0KICAgICAgICAgICAgdmFyIHJlbGF0b3M9T2JqZWN0LmtleXMob2JqLnJlbGF0byk7DQogICAgICAgICAgICByZWxhdG9zLnNwbGljZShyZWxhdG9zLmluZGV4T2YoJ2Rpc3BsYXknKSwxKTsNCiAgICAgICAgICAgIGZvcih2YXIgaz0wO2s8cmVsYXRvcy5sZW5ndGg7aysrKXsNCiAgICAgICAgICAgICAgICB2YXIgZD1yZWxhdG9zW2tdOw0KICAgICAgICAgICAgICAgIGV4dHJhUmVsYVtkXS5pc0M9dHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG9iai5yZWxhdG8uZGlzcGxheSA9IHBzaG93Ow0KICAgICAgICB9DQogICAgfQ0KICAgIGlmKG9iai5jYWxsKXsNCiAgICAgICAgdmFyIGNhbGxzPU9iamVjdC5rZXlzKG9iai5jYWxsKTsNCiAgICAgICAgaWYoY2hlY2tJRCE9PW9iail7DQogICAgICAgICAgICBmb3IodmFyIGk9MDtpIDwgY2FsbHMubGVuZ3RoO2krKyl7DQogICAgICAgICAgICAgICAgdmFyIGE9Y2FsbHNbaV0uc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgdmFyIGI9b2JqLmNhbGxbY2FsbHNbaV1dOw0KICAgICAgICAgICAgICAgIHZhciBjPWIudG9ndHlwZTsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKS5zdHlsZS5kaXNwbGF5PXNob3c7DQogICAgICAgICAgICAgICAgaWYgKGIucmVsYWZyb20mJiFjKXsNCiAgICAgICAgICAgICAgICAgICAgaWYoYi5yZWxhZnJvbS5kaXNwbGF5IT09IHNob3cpew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGFmcm9tcz1PYmplY3Qua2V5cyhiLnJlbGFmcm9tKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGFmcm9tcy5zcGxpY2UocmVsYWZyb21zLmluZGV4T2YoJ2Rpc3BsYXknKSwxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaz0wO2s8cmVsYWZyb21zLmxlbmd0aDtrKyspew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkPXJlbGFmcm9tc1trXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYVJlbGFbZF0uaXNDPXRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBiLnJlbGFmcm9tLmRpc3BsYXkgPSBzaG93Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChiLnJlbGF0byYmIWMpew0KICAgICAgICAgICAgICAgICAgICBpZihiLnJlbGF0by5kaXNwbGF5IT09IHNob3cpew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0b3M9T2JqZWN0LmtleXMoYi5yZWxhdG8pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRvcy5zcGxpY2UocmVsYXRvcy5pbmRleE9mKCdkaXNwbGF5JyksMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGs9MDtrPHJlbGF0b3MubGVuZ3RoO2srKyl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQ9cmVsYXRvc1trXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYVJlbGFbZF0uaXNDPXRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBiLnJlbGF0by5kaXNwbGF5ID0gc2hvdzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihjKXsNCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZ1tlZFxcOnRvZ3RvcGljaWQ9JyIrYSsiJ10iKS5zdHlsZS5kaXNwbGF5PXNob3c7DQogICAgICAgICAgICAgICAgICAgIGlmKGM9PT0nbWludXMnKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHV0ZChiLGEsc2hvdykNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoKGIuY2FsbHx8Yi5ib3VuZGFyeXx8Yi5zdW1tYXJ5KSYmYz09PSdwbHVzJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdXRkKGIsYSxzaG93LHRydWUpDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYoYi5jYWxsJiYhYykgew0KICAgICAgICAgICAgICAgICAgICB1dGQoYixhLHNob3csdHJ1ZSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGIuc3VtbWFyeSYmIWMpIHsNCiAgICAgICAgICAgICAgICAgICAgdXRkKGIsYSxzaG93KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoYi5ib3VuZGFyeSYmIWMpIHsNCiAgICAgICAgICAgICAgICAgICAgdXRkKGIsYSxzaG93KQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGlmKG9iai5zdW1tYXJ5KXsNCiAgICAgICAgdmFyIHN1bW1hcnlzPU9iamVjdC5rZXlzKG9iai5zdW1tYXJ5KTsNCiAgICAgICAgaWYoKGNoZWNrSUQhPT1vYmomJihvYmoudG9ndHlwZT09PSdtaW51cyd8fCFvYmoudG9ndHlwZSkpfHxjaGVja0lEPT09b2JqKXsNCiAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8c3VtbWFyeXMubGVuZ3RoO2krKyl7DQogICAgICAgICAgICAgICAgdmFyIGE9c3VtbWFyeXNbaV0uc2xpY2UoMSk7DQogICAgICAgICAgICAgICAgdmFyIGI9b2JqLnN1bW1hcnlbc3VtbWFyeXNbaV1dOw0KICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGEpOw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpLnN0eWxlLmRpc3BsYXk9c2hvdzsNCi8vICAgICAgICAgICAgICAgIGlmKGMpew0KLy8gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDp0b2d0b3BpY2lkPSciK2ErIiddIikuc3R5bGUuZGlzcGxheT1zaG93Ow0KLy8gICAgICAgICAgICAgICAgICAgIGlmKGM9PT0nbWludXMnKXsNCi8vICAgICAgICAgICAgICAgICAgICAgICAgdXRkKGIsc2hvdykNCi8vICAgICAgICAgICAgICAgICAgICB9DQovLyAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2FsbCYmYz09PSdwbHVzJykgew0KLy8gICAgICAgICAgICAgICAgICAgICAgICB1dGQoYixzaG93LHRydWUpDQovLyAgICAgICAgICAgICAgICAgICAgfQ0KLy8gICAgICAgICAgICAgICAgfQ0KLy8gICAgICAgICAgICAgICAgaWYoYi5jYWxsJiYhYykgew0KLy8gICAgICAgICAgICAgICAgICAgIHV0ZChiLHNob3csdHJ1ZSkNCi8vICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihPYmplY3Qua2V5cyhiKS5sZW5ndGghPT0wKXsNCiAgICAgICAgICAgICAgICAgICAgdXRkKGIsYSxzaG93KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZihvYmouYm91bmRhcnkpew0KICAgICAgICB2YXIgYm91bmRhcnlzPU9iamVjdC5rZXlzKG9iai5ib3VuZGFyeSk7DQogICAgICAgIGlmKGNoZWNrSUQhPT1vYmopew0KICAgICAgICAgICAgZm9yKHZhciBpPTA7aTxib3VuZGFyeXMubGVuZ3RoO2krKyl7DQogICAgICAgICAgICAgICAgdmFyIGE9Ym91bmRhcnlzW2ldLnNsaWNlKDEpOw0KICAgICAgICAgICAgICAgIHZhciBiPW9iai5ib3VuZGFyeVtib3VuZGFyeXNbaV1dOw0KICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGEpOw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpLnN0eWxlLmRpc3BsYXk9c2hvdzsNCi8vICAgICAgICAgICAgICAgIGlmKGMpew0KLy8gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImdbZWRcXDp0b2d0b3BpY2lkPSciK2ErIiddIikuc3R5bGUuZGlzcGxheT1zaG93Ow0KLy8gICAgICAgICAgICAgICAgICAgIGlmKGM9PT0nbWludXMnKXsNCi8vICAgICAgICAgICAgICAgICAgICAgICAgdXRkKGIsc2hvdykNCi8vICAgICAgICAgICAgICAgICAgICB9DQovLyAgICAgICAgICAgICAgICAgICAgaWYgKGIuY2FsbCYmYz09PSdwbHVzJykgew0KLy8gICAgICAgICAgICAgICAgICAgICAgICB1dGQoYixzaG93LHRydWUpDQovLyAgICAgICAgICAgICAgICAgICAgfQ0KLy8gICAgICAgICAgICAgICAgfQ0KLy8gICAgICAgICAgICAgICAgaWYoYi5jYWxsJiYhYykgew0KLy8gICAgICAgICAgICAgICAgICAgIHV0ZChiLHNob3csdHJ1ZSkNCi8vICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihPYmplY3Qua2V5cyhiKS5sZW5ndGghPT0wKXsNCiAgICAgICAgICAgICAgICAgICAgdXRkKGIsYSxzaG93KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZighb2MmJm9iai5jaGlsZCkgew0KICAgICAgICB2YXIgY2hpbGRzID0gT2JqZWN0LmtleXMob2JqLmNoaWxkKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBhID0gY2hpbGRzW2ldLnNsaWNlKDEpOw0KICAgICAgICAgICAgdmFyIGIgPSBvYmouY2hpbGRbY2hpbGRzW2ldXTsNCiAgICAgICAgICAgIHZhciBjID0gYi50b2d0eXBlOw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkuc3R5bGUuZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICBpZiAoYi5yZWxhZnJvbSYmIWMpew0KICAgICAgICAgICAgICAgIGlmKGIucmVsYWZyb20uZGlzcGxheSE9PSBzaG93KXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGFmcm9tcz1PYmplY3Qua2V5cyhiLnJlbGFmcm9tKTsNCiAgICAgICAgICAgICAgICAgICAgcmVsYWZyb21zLnNwbGljZShyZWxhZnJvbXMuaW5kZXhPZignZGlzcGxheScpLDEpOw0KICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGs9MDtrPHJlbGFmcm9tcy5sZW5ndGg7aysrKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkPXJlbGFmcm9tc1trXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhUmVsYVtkXS5pc0M9dHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBiLnJlbGFmcm9tLmRpc3BsYXkgPSBzaG93Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChiLnJlbGF0byYmIWMpew0KICAgICAgICAgICAgICAgIGlmKGIucmVsYXRvLmRpc3BsYXkhPT0gc2hvdyl7DQogICAgICAgICAgICAgICAgICAgIHZhciByZWxhdG9zPU9iamVjdC5rZXlzKGIucmVsYXRvKTsNCiAgICAgICAgICAgICAgICAgICAgcmVsYXRvcy5zcGxpY2UocmVsYXRvcy5pbmRleE9mKCdkaXNwbGF5JyksMSk7DQogICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaz0wO2s8cmVsYXRvcy5sZW5ndGg7aysrKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkPXJlbGF0b3Nba107DQogICAgICAgICAgICAgICAgICAgICAgICBleHRyYVJlbGFbZF0uaXNDPXRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYi5yZWxhdG8uZGlzcGxheSA9IHNob3c7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGMpIHsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJnW2VkXFw6dG9ndG9waWNpZD0nIiArIGEgKyAiJ10iKS5zdHlsZS5kaXNwbGF5ID0gc2hvdzsNCiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ21pbnVzJykgew0KICAgICAgICAgICAgICAgICAgICB1dGQoYixhLHNob3cpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICgoYi5jYWxsfHxiLmJvdW5kYXJ5fHxiLnN1bW1hcnkpJiZjPT09J3BsdXMnKSB7DQogICAgICAgICAgICAgICAgICAgIHV0ZChiLGEsc2hvdyx0cnVlKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChiLmNhbGwmJiFjKSB7DQogICAgICAgICAgICAgICAgdXRkKGIsYSxzaG93LHRydWUpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoYi5zdW1tYXJ5JiYhYykgew0KICAgICAgICAgICAgICAgIHV0ZChiLGEsc2hvdykNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChiLmJvdW5kYXJ5JiYhYykgew0KICAgICAgICAgICAgICAgIHV0ZChiLGEsc2hvdykNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KZnVuY3Rpb24gZXh0cmFSZWxhRmluKCkgew0KICAgIHZhciBleHRyYWtleXM9T2JqZWN0LmtleXMoZXh0cmFSZWxhKTsNCiAgICBmb3IodmFyIGk9MDtpPGV4dHJha2V5cy5sZW5ndGg7aSsrKXsNCiAgICAgICAgdmFyIGV4dHJhT2JqPWV4dHJhUmVsYVtleHRyYWtleXNbaV1dOw0KICAgICAgICBpZihleHRyYU9iai5pc0MgPT09IHRydWUpew0KICAgICAgICAgICAgdmFyIGZzaG93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGV4dHJhT2JqLmZyb21pZCkuc3R5bGUuZGlzcGxheSAhPT0nbm9uZSc/IHRydWU6IGZhbHNlOw0KICAgICAgICAgICAgdmFyIHRzaG93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGV4dHJhT2JqLnRvaWQpLnN0eWxlLmRpc3BsYXkgIT09J25vbmUnPyB0cnVlOiBmYWxzZTsNCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGV4dHJhT2JqLmlkKS5zdHlsZS5kaXNwbGF5PWZzaG93ICYmIHRzaG93PyAnYmxvY2snOiAnbm9uZSc7DQogICAgICAgICAgICBleHRyYVJlbGFbZXh0cmFrZXlzW2ldXS5pc0MgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCn0='))</script>
  </body>
</html>
